home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / nihcl-30.lha / nihcl-3.0 / ex / ArrayOb.c < prev    next >
C/C++ Source or Header  |  1990-05-15  |  5KB  |  219 lines

  1. // ArrayOb.c -- Basic polymorphic array of objects
  2.  
  3. #include <malloc.h>
  4. #include "ArrayOb.h"
  5. #include "nihclIO.h"
  6.  
  7. #define THIS    ArrayOb
  8. #define BASE    Collection
  9. #define BASE_CLASSES Collection::desc()
  10. #define MEMBER_CLASSES
  11. #define VIRTUAL_BASE_CLASSES
  12.  
  13. DEFINE_CLASS(ArrayOb,1,"$Header: /afs/alw.nih.gov/unix/sun4_40c/usr/local/src/nihcl-3.0/share/ex/RCS/ArrayOb.c,v 3.0 90/05/15 22:43:20 kgorlen Rel $",NULL,NULL);
  14.  
  15. extern const int NIHCL_ALLOCSIZE, NIHCL_INDEXRANGE;
  16.  
  17. ArrayOb::ArrayOb(unsigned size)
  18. {
  19.     sz = size;
  20.     if (sz==0) allocSizeErr();
  21.     v = new Object*[sz];
  22.     register i = sz;
  23.     register Object** vp = v;
  24.     while (i--) *vp++ = nil;
  25. }
  26.     
  27. ArrayOb::ArrayOb(const ArrayOb& a)
  28. {
  29.     register i = a.sz;
  30.     sz = i;
  31.     v = new Object*[i];
  32.     register Object** vp = v;
  33.     register Object** av = a.v;
  34.     while (i--) *vp++ = *av++;
  35. }
  36.  
  37. void ArrayOb::operator=(const ArrayOb& a)
  38. {
  39.     if (v != a.v) {
  40.         delete v;
  41.         v = new Object*[sz=a.sz];
  42.         register i = a.sz;
  43.         register Object** vp = v;
  44.         register Object** av = a.v;
  45.         while (i--) *vp++ = *av++;
  46.     }
  47. }
  48.  
  49. bool ArrayOb::operator==(const ArrayOb& a) const
  50. {
  51.     if (sz != a.sz) return NO;
  52.     register unsigned i = sz;
  53.     register Object** vp = v;
  54.     register Object** av = a.v;
  55.     while (i--) {
  56.         if (!((*vp++)->isEqual(**av++))) return NO;
  57.     }
  58.     return YES;
  59. }
  60.  
  61. const Class* ArrayOb::species() const { return &classDesc; }
  62.  
  63. bool ArrayOb::isEqual(const Object& a) const
  64. {
  65.     return a.isSpecies(classDesc) && *this==(const ArrayOb&)a;
  66. }
  67.  
  68. unsigned ArrayOb::hash() const
  69. {
  70.     register unsigned h = sz;
  71.     register unsigned i = sz;
  72.     register Object** vp = v;
  73.     while (i--) h^=(*vp++)->hash();
  74.     return h;
  75. }
  76.  
  77. void ArrayOb::deepenShallowCopy()
  78. {
  79.     BASE::deepenShallowCopy();
  80.     register i = sz;
  81.     register Object** vp = v;
  82.     while (i--) {
  83.         *vp = (*vp)->deepCopy();
  84.         vp++;
  85.     }
  86. }
  87.  
  88. Collection& ArrayOb::addContentsTo(Collection& cltn) const
  89. {
  90.     register Object** vp = v;
  91.     register unsigned i = sz;
  92.     while (i--) cltn.add(**vp++);
  93.     return cltn;
  94. }
  95.  
  96. Object*& ArrayOb::at(int i)         { return (*this)[i]; }
  97.  
  98. const Object *const& ArrayOb::at(int i) const
  99.     { return (*this)[i]; }
  100.  
  101. unsigned ArrayOb::capacity() const  { return sz; }
  102.     
  103. int ArrayOb::compare(const Object& arg) const
  104. // Compare two arrays of objects.  If *this > arg return >0,
  105. // *this == arg return 0, and if *this < arg return <0.
  106. {
  107.     assertArgSpecies(arg,classDesc,"compare");
  108.     ArrayOb& a = (ArrayOb&)arg;
  109.     for (int i=0; i<sz; i++) {
  110. // previous elements compared equal;
  111. // longer ArrayOb is therefore larger
  112.         if (i == a.sz) return 1;
  113. // compare() != 0 at any element determines ordering
  114.         int val;
  115.         if ((val = v[i]->compare(*a.v[i])) != 0) return val;
  116.     }
  117. // all elements in this ArrayOb compare() equal to arg ArrayOb
  118.     if (sz == a.sz) return 0;
  119.     return -1;
  120. }
  121.  
  122. Object* ArrayOb::doNext(Iterator& pos) const
  123. {
  124.     if (pos.index < size()) return v[pos.index++];
  125.     return 0;
  126. }
  127.  
  128. void ArrayOb::reSize(unsigned newsize)
  129. {
  130.     if (newsize == 0) allocSizeErr();
  131.     v = (Object**)realloc((char*)v,newsize*sizeof(Object*));
  132.     if (newsize > sz) {     // initialize new space to nil
  133.         Object** vp = &v[sz];
  134.         while (newsize > sz) {
  135.             *vp++ = nil;
  136.             sz++;
  137.         }
  138.     }
  139.     else sz = newsize;
  140. }
  141.  
  142. void ArrayOb::removeAll()
  143. {
  144.     register Object** vp = v;
  145.     register unsigned i = sz;
  146.     while (i--) *vp++ = nil;
  147. }
  148.  
  149. unsigned ArrayOb::size() const  { return sz; }
  150.  
  151. void ArrayOb::allocSizeErr() const
  152. {
  153.     setError(NIHCL_ALLOCSIZE,DEFAULT,this,className());
  154. }
  155.  
  156. void ArrayOb::indexRangeErr() const
  157. {
  158.     setError(NIHCL_INDEXRANGE,DEFAULT,this,className());
  159. }
  160.  
  161. ArrayOb::ArrayOb(OIOin& strm)
  162.     : BASE(strm)
  163. {
  164.     strm >> sz;
  165.     v = new Object*[sz];
  166.     for (register unsigned i=0; i<sz; i++)
  167.         v[i] = Object::readFrom(strm);
  168. }
  169.  
  170. void ArrayOb::storer(OIOout& strm) const
  171. {
  172.     BASE::storer(strm);
  173.     strm << sz;
  174.     for (register unsigned i=0; i<sz; i++)
  175.         v[i]->storeOn(strm);
  176. }
  177.  
  178. ArrayOb::ArrayOb(OIOifd& fd)
  179.     : BASE(fd)
  180. {
  181.     fd >> sz;
  182.     v = new Object*[sz];
  183.     for (register unsigned i=0; i<sz; i++ )
  184.         v[i] = Object::readFrom(fd);
  185. }
  186.  
  187. void ArrayOb::storer(OIOofd& fd)  const
  188. {
  189.     Object::storer(fd);
  190.     fd << sz;
  191.     for (register unsigned i=0; i<sz; i++) 
  192.         v[i]->storeOn(fd);
  193. }
  194.  
  195. Object* ArrayOb::add(Object& ob)
  196. {
  197.     shouldNotImplement("add");
  198.     return &ob;
  199. }
  200.  
  201. unsigned ArrayOb::occurrencesOf(const Object&) const
  202. {
  203.     shouldNotImplement("occurrencesOf");
  204.     return 0;
  205. }
  206.  
  207. Object* ArrayOb::remove(const Object&)
  208. {
  209.     shouldNotImplement("remove");
  210.     return 0;
  211. }
  212.  
  213. // Not described in book:
  214.  
  215. void ArrayOb::sort()
  216. {
  217.     shouldNotImplement("sort");
  218. }
  219.